package com.it.flowable.listener;

import lombok.extern.slf4j.Slf4j;
import org.flowable.common.engine.api.delegate.event.FlowableEntityEvent;
import org.flowable.common.engine.api.delegate.event.FlowableEvent;
import org.flowable.common.engine.api.delegate.event.FlowableEventListener;
import org.flowable.engine.impl.persistence.entity.ExecutionEntity;
import org.flowable.task.service.impl.persistence.entity.TaskEntity;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class GlobalFlowListener implements FlowableEventListener {

    @Override
    public void onEvent(FlowableEvent event) {
        String eventType = event.getType().name();
        log.info("[FlowableEventListener] 捕获事件类型: {}", eventType);

        // 关键：判断事件是否是一个实体事件（大部分重要事件都是）
        if (event instanceof FlowableEntityEvent) {
            FlowableEntityEvent entityEvent = (FlowableEntityEvent) event;
            Object entity = entityEvent.getEntity();

            // 根据实体类型提取信息
            if (entity instanceof TaskEntity) {
                // 处理任务相关事件（TASK_CREATED, TASK_COMPLETED, TASK_ASSIGNED...）
                TaskEntity task = (TaskEntity) entity;
                String processInstanceId = task.getProcessInstanceId(); // 流程实例ID
                String processDefinitionId = task.getProcessDefinitionId(); // 流程定义ID
                String executionId = task.getExecutionId(); // 执行流ID
                String taskId = task.getId(); // 任务ID
                String taskDefinitionKey = task.getTaskDefinitionKey(); // 任务节点KEY（非常重要！）
                String taskName = task.getName(); // 任务名称
                String assignee = task.getAssignee(); // 任务负责人

                // 获取流程定义KEY：通常从processDefinitionId中提取
                // 格式通常是：key:version:randomId (e.g., myProcess:1:12345)
                String processDefinitionKey = null;
                if (task.getProcessDefinitionId() != null) {
                    processDefinitionKey = task.getProcessDefinitionId().split(":")[0];
                }

                log.info("[FlowableEventListener 任务事件] {};流程实例ID: {};流程定义KEY: {};任务节点KEY: {};任务ID: {};负责人: {}", eventType, processInstanceId, processDefinitionKey, taskDefinitionKey, taskId, assignee);

                // 在这里，您就可以使用 processDefinitionKey 和 taskDefinitionKey
                // 去查询您的消息配置表，判断是否需要发送消息了！

                // // ... 获取上述基本信息 ...
                //
                // // 获取业务KEY
                // ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
                //         .processInstanceId(task.getProcessInstanceId())
                //         .singleResult();
                // String businessKey = processInstance.getBusinessKey();
                //
                // log.info("业务KEY: {}", businessKey);
                //


                // // ... 获取上述基本信息 ...
                //
                // // 获取所有流程变量（谨慎使用，性能开销大）
                // Map<String, Object> variables = taskService.getVariables(task.getId());
                // String applicant = (String) variables.get("applicant");
                // Integer amount = (Integer) variables.get("amount");
                //
                // // 或者获取特定变量
                // Object specificVariable = taskService.getVariable(task.getId(), "myVariable");
            } else if (entity instanceof ExecutionEntity) {
                // 处理流程实例相关事件（PROCESS_STARTED, PROCESS_COMPLETED...）
                ExecutionEntity execution = (ExecutionEntity) entity;
                String processInstanceId = execution.getProcessInstanceId();
                String processDefinitionId = execution.getProcessDefinitionId();
                String activityId = execution.getActivityId(); // 当前活动的元素ID

                // 同样获取流程定义KEY
                String processDefinitionKey = null;
                if (execution.getProcessDefinitionId() != null) {
                    processDefinitionKey = execution.getProcessDefinitionId().split(":")[0];
                }

                log.info("[FlowableEventListener 流程事件] {};流程实例ID: {};流程定义KEY: {};当前活动: {}", eventType, processInstanceId, processDefinitionKey, activityId);
            } else {
                log.debug("事件实体类型: {}", entity.getClass().getSimpleName());
            }
        } else {
            // 处理非实体事件（如ENGINE_CREATED）
            log.debug("非实体事件: {}", eventType);
        }
    }

    /**
     * 关键方法：是否在异常时失败
     * 返回 false 确保监听器异常不会中断引擎主流程
     */
    @Override
    public boolean isFailOnException() {
        return false; // 必须为false，防止监听器异常导致引擎崩溃
    }

    /**
     * 关键方法：是否为事务生命周期事件
     * 如果返回 true，监听器将在事务的特定时间点被调用
     */
    @Override
    public boolean isFireOnTransactionLifecycleEvent() {
        return false; // 通常设为false，除非需要精确的事务控制
    }

    /**
     * 关键方法：指定事务生命周期中的何时触发
     * 只有在 isFireOnTransactionLifecycleEvent() 返回 true 时有效
     * 可选值: "before-commit", "after-rollback", "committed", "rolled-back"
     */
    @Override
    public String getOnTransaction() {
        return null; // 使用默认行为
    }

    // /**
    //  * 最重要方法之一：指定监听哪些事件类型
    //  * 这样监听器就不会处理所有事件，大大提高效率
    //  */
    // @Override
    // public Collection<? extends FlowableEventType> getTypes() {
    //     // 只返回我们关心的5种消息类型对应的事件
    //     return Collections.unmodifiableSet(new HashSet<>(Arrays.asList(
    //         FlowableEngineEventType.TASK_CREATED,
    //         FlowableEngineEventType.TASK_COMPLETED,
    //         FlowableEngineEventType.TASK_ASSIGNED,
    //         FlowableEngineEventType.ACTIVITY_CANCELLED
    //     )));
    // }
}